springBoot  정시 작업 생 성 과정 설명

머리말
며칠 동안 쓰 지 않 았 습 니 다.일이 좀 바 쁩 니 다.최근 에 작업 이 마침 정시 작업 통 계 를 만 들 었 기 때문에 spring boot 가 어떻게 정시 임 무 를 만 드 는 지 정 리 했 습 니 다.
전체적으로 말 하면 spring boot 에서 정시 작업 을 만 드 는 것 은 매우 간단 합 니 다.spring 이나 springmvc 처럼 xml 파일 에 설정 하지 않 고 프로젝트 가 시 작 될 때 불 러 옵 니 다.spring boot 는 주 해 를 사용 하면 정시 작업 을 완전히 지원 할 수 있 습 니 다.
그러나 기본 주 해 를 사용 하면 정시 작업 이 필요 한 시간 이 자주 바 뀔 수 있 습 니 다.주 해 는 수정 하기 어렵 고 매번 다시 컴 파일 해 야 하기 때문에 정시 시간 에 데이터 베 이 스 를 저장 한 다음 에 프로젝트 가 데이터 베 이 스 를 읽 고 정시 작업 을 수행 하려 고 하기 때문에 인터페이스 기반 의 정시 작업 이 있 습 니 다.다음은 주석 기반 과 인터페이스 기반 상세 설명 으로 나 뉜 다.
주해 에 기초 하 다
pom.xml 파일 은 수정 하지 않 아 도 됩 니 다.우리 의 원래 프로젝트 는 지원 합 니 다.사실은 타 이 머 는 springboot 프레임 워 크 가 자체 적 으로 가지 고 있 기 때문에 의존 할 필요 가 없습니다.우 리 는 Autotask 패 키 지 를 직접 만 들 고 AutoTask 클래스 를 만 듭 니 다.

@EnableScheduling
@Component
@Slf4j
public class AutoTask {
 @Scheduled(cron="*/6 * * * * ?")
 private void process(){
  log.info("autoTask ");
 }
}
이 타이머 가 생 성 됩 니 다.프로젝트 가 시작 되면 6s 마다"autoTask"로 그 를 인쇄 합 니 다.쉽 지?주로 사용 되 는 두 가지 주 해 는@Enablescheduling 과@Scheduled 입 니 다.
주해@Enable Scheduling 은 정시 작업 을 시작 합 니 다.어떤 종류의 방법 이 정기 적 으로 실행 되 려 면 이 종류 에 이 주 해 를 넣 으 세 요.물론 이 주 해 는 시동 류 에 도 넣 을 수 있다.시작 클래스 에 항목 의 모든 클래스 가 정시 작업 을 만 들 수 있 음 을 표시 합 니 다.

@Scheduled 주 해 는 우리 가 흔히 볼 수 있 는 타이머 입 니 다.뒤의 cron 은 정시 작업 표현 식 입 니 다.방법 에 주 해 를 달 면 이 방법 이 정기 적 으로 집행 되 는 것 을 나타 낸다.

그러나@Scheduled 는 두 가지 설정 을 할 수 있 습 니 다.우리 가 잘 아 는 cron,그리고 하 나 는 fixed Rate 입 니 다.예 를 들 어 fixed Rate=6000 표시 방법 은 6 초 에 한 번 씩 실행 된다.
프로젝트 를 시작 해 보 자.두 가지 방법 이 모두 정기 적 으로 실행 되 고 있 는 것 을 볼 수 있다.

인터페이스 기반
위 에서 볼 수 있 는 spring boot 는 주 해 를 바탕 으로 하 는 것 이 매우 편리 하 다.하지만 잦 은 변동 이나 한 항목 에 타이머 가 많 으 면 관리 하기 어렵다.그래서 타이머 정 보 를 데이터베이스 에 통일 적 으로 저장 합 니 다.

DROP TABLE IF EXISTS `scheduled`;
CREATE TABLE `scheduled` (
 `cron_id` varchar(30) NOT NULL PRIMARY KEY,
 `cron_name` varchar(30) NULL,
 `cron` varchar(30) NOT NULL
);
INSERT INTO `scheduled` VALUES ('1','      ','0/6 * * * * ?');

dao 층 mapper 1 패키지 아래 CronMapper 인 터 페 이 스 를 만 들 면 cron 을 쉽게 가 져 옵 니 다.

public interface CronMapper {

 @Select("select cron from scheduled where cron_id = #{id}")
 public String getCron(int id);
}

여기 서비스 층 안 쓸 게 요.Autotask 패키지 아래 AutoTask FromDB 클래스 를 직접 만 듭 니 다.

@Slf4j
@Component
public class AutoTaskFromDB implements SchedulingConfigurer {

 @Autowired
 protected CronMapper cronMapper;

 @Override
 public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

  scheduledTaskRegistrar.addTriggerTask(() -> process(),
    triggerContext -> {
     String cron = cronMapper.getCron(1);
     if (cron.isEmpty()) {
      log.info("cron   ");
     }
     return new CronTrigger(cron).nextExecutionTime(triggerContext);
    }
  );
 }

 private void process(){
  log.info("formDB ");
 }
}
보 이 는 것 도 간단 합 니 다.바로 Scheduling Configurer 라 는 인 터 페 이 스 를 실현 하 는 것 입 니 다.addTrigger Task()는 타 이 머 를 추가 하 는 것 입 니 다.
process()방법 은 우리 가 정시 에 실행 해 야 할 방법 체 이다.
CronTrigger(cron).nextExecutionTime(triggerContext)은 데이터베이스 에서 읽 은 cron 에서 타 이 머 를 만 드 는 것 입 니 다.
이 종 류 는@Enable Scheduling 주 해 를 추가 하지 않 았 습 니 다.제 가 시작 클래스 에 추 가 했 기 때 문 입 니 다.만약 에 시작 클래스 에 추가 하지 않 았 다 면 여기에 추가 하 는 것 을 기억 하 세 요.
테스트 해 보기;아래 그림 은 세 개의 정시 작업 이 모두 실 행 된 것 을 볼 수 있 습 니 다.from DB 는 데이터 베이스 에서 읽 었 습 니 다.

cron
cron 용법 은 인터넷 에 많 고 할 말 도 없 으 니 여기에 기록 해 두 세 요.
구조
cron 표현 식 은 문자열 입 니 다.6 또는 7 개의 도 메 인 으로 나 뉘 어 두 도 메 인 사 이 를 빈 칸 으로 구분 합 니 다.
그 문법 형식 은'초 역 분 역 시간 역 일 역 월 역 주 역 년 역'입 니 다.
수치 범위
도 메 인 이름
가 취 값
취 할 수 있 는 기호(열 부분 만 자주 사용)
초 역
0~59 의 정수
* - , /
분 역
0~59 의 정수
* - , /
시역
0~23 의 정수
* - , /
일본
1~31 의 정수
* - , / ? L
월 역
1~12 의 정수 또는 JAN~DEC
* - , /
주역
1~7 의 정수 나 SUN~SAT.
* - , / ? L #
년 역
1970~1999 의 정수
* - , /
상례
표현 식
의의
5 초 에 한 번 씩 실행 합 니 다.
*/5 * * * * ?
1 분 간격 으로 실행
0 * /1 * * * ?
매일 1 시 에 한 번 씩 실행 합 니 다.
    0 0 1 * * ?
매일 23 시 55 분 에 한 번 씩 집행 합 니 다.
   0 55 23 * * ?
매월 마지막 날 23 시 에 한 번 씩 집행 한다.
    0 0 23 L * ?
매주 6,8 시 에 한 번 씩 집행 합 니 다.
    0 0 8 ? * L
매월 마지막 금요일 에 2 시간 간격 으로 집행 한다.
   0 0 */2 ? * 6L
매월 셋째 금요일 오전 10 시 15 분 에 한 번 씩 집행 합 니 다.
    0 15 10 ? * 5#3
매일 오후 2 시 부터 오후 2 시 까지 1 분 마다 실 행 됩 니 다.
    0 0-5 14 * * ?
월요일 부터 금요일 까지 매일 오전 10 시 15 분 에 집행 한 다 는 뜻 입 니 다.
   0 15 10 ? * 2-6
매달 마지막 금요일 오전 10 시 15 분 에 실 행 됩 니 다.
    0 15 10 ? * 6L
매일 오전 10 시,오후 2 시,4 시 에 한 번 씩 집행 한다.
    0 0 10,14,16 * * ?
아침 9 시 5 분 근무 시간 내 에 30 분 마다 한 번 씩 집행 한다.
    0 0/30 9-17 * * ?
매주 수요일 낮 12 시 에 한 번 씩 실행 합 니 다.
   0 0 12 ? * 4
매년 3 월 수요일 오후 2 시 10 분과 2 시 44 분 에 한 번 씩 집행 합 니 다.
    0 10,44 14 ? 3 4 
매월 셋째 금요일 오전 10 시 15 분 에 한 번 씩 집행 합 니 다.
    0 15 10 ? * 6#3
월 1 일 새벽 2 시 30 분 에 한 번 씩 집행 한다.
    0 30 2 1 * ?
분당 10 초 와 20 초 에 실 행 됩 니 다.
    10,20 * * * * ?
매월 둘째 주 금요일 새벽 집행
    0 0 0 ? * 6#2
외국
원래 이 지식 포 인 트 는 여기에 두 고 말 해 서 는 안 되 지만 많 지 않 습 니 다.쓰 는 김 에 타 이 머 를 만 들 수 있 습 니 다.우리 프로젝트 에는 프로젝트 가 시 작 될 때 실행 해 야 할 수요 가 있 습 니 다.그러면 이것 은 우리 가 어떻게 실현 합 니까?사실 spring boot 는 사용 하기 도 매우 간단 합 니 다.애플 리 케 이 션 러 너 만 실현 하면 됩 니 다.
우 리 는 autotask 패키지 아래 에 AutoTask FromSpringRunner 클래스 를 만 듭 니 다.

@Slf4j
@Component
public class AutoTaskFromSpringRunner implements ApplicationRunner {

 @Override
 public void run(ApplicationArguments args) throws Exception {
  process();
 }

 private void process(){
  log.info(" run ApplicationArguments");
 }
}
프로젝트 를 시작 해 보면 프로젝트 가 시 작 된 후에 실 행 될 수 있 지만 한 번 만 실 행 될 수 있 습 니 다.

그럼 이 걸 타이머 로 어떻게 쓰 죠?물론 라인 과 결합 해서 하 는 것 이지 만 이 방법 은 사실 건의 하지 않 는 다.b 라인 은 문제 가 생기 기 쉽 지만 사고방식 을 제공한다.

@Slf4j
@Component
public class AutoTaskFromSpringRunner implements ApplicationRunner {

 @Override
 public void run(ApplicationArguments args) throws Exception {
  process();
  new Thread(() -> {
   while (true) {
    process2();
    try {
     Thread.sleep(6000);
    } catch (InterruptedException e) {
     log.error("{}",e);
    }
   }
  }).start();
 }
 private void process(){
  log.info(" run ApplicationArguments");
 }
 private void process2(){
  log.info("     ");
 }
}
시작 항목 을 보면 타이머 역할 을 할 수 있 습 니 다.

자,이렇게 많이 말 하 겠 습 니 다.오늘 프로젝트 의 코드 도 github 에 동기 화 되 었 습 니 다.
github 주소:https://github.com/QuellanAn/zlflovemm
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기